/**
 * 文件系统操作工具类
 * 用于处理离线地图瓦片的复制和读取
 */

// 地图瓦片相对路径
const TILES_DIR = '/static/baidu_tiles';
// 沙盒内瓦片存储目录
const SANDBOX_TILES_DIR = '_doc/baidu_tiles';

/**
 * 检查瓦片文件是否存在
 * @param path 瓦片路径
 * @returns Promise<boolean>
 */
export function checkTileExist(path: string): Promise<boolean> {
  return new Promise((resolve) => {
    const fileManager = uni.getFileSystemManager();
    fileManager.access({
      path,
      success: () => resolve(true),
      fail: () => resolve(false)
    });
  });
}

/**
 * 将瓦片从应用资源目录复制到可读写的沙盒目录
 * @returns Promise<boolean>
 */
export async function copyTilesToSandbox(): Promise<boolean> {
  try {
    const fileManager = uni.getFileSystemManager();
    
    // 检查沙盒目录是否已存在
    const sandboxExists = await checkTileExist(SANDBOX_TILES_DIR);
    if (sandboxExists) {
      console.log('沙盒瓦片目录已存在，无需复制');
      return true;
    }
    
    // 创建沙盒目录
    await new Promise<void>((resolve, reject) => {
      fileManager.mkdir({
        dirPath: SANDBOX_TILES_DIR,
        recursive: true,
        success: () => resolve(),
        fail: (err) => reject(err)
      });
    });
    
    // 在HBuilderX环境中，直接复制整个目录
    await new Promise<void>((resolve, reject) => {
      fileManager.copyFile({
        srcPath: TILES_DIR,
        destPath: SANDBOX_TILES_DIR,
        success: () => resolve(),
        fail: (err) => {
          console.error('复制瓦片失败:', err);
          reject(err);
        }
      });
    });

    return true;
  } catch (error) {
    console.error('处理瓦片文件失败:', error);
    return false;
  }
}

/**
 * 获取瓦片URL（支持离线和在线）
 * @param x 瓦片X坐标
 * @param y 瓦片Y坐标
 * @param z 缩放级别
 * @param isOffline 是否离线模式
 * @returns 瓦片URL
 */
export function getTileUrl(x: number, y: number, z: number, isOffline: boolean = true): string {
  if (isOffline) {
    // 返回本地瓦片路径
    return `${SANDBOX_TILES_DIR}/${z}/${x}/${y}.png`;
  } else {
    // 返回在线百度地图瓦片URL（需要有效的API密钥）
    return `https://api.map.baidu.com/tile/?qt=tile&x=${x}&y=${y}&z=${z}&styles=pl`;
  }
}

/**
 * 检查离线瓦片是否完整
 * @param minZoom 最小缩放级别
 * @param maxZoom 最大缩放级别
 * @returns Promise<boolean>
 */
export async function validateOfflineTiles(minZoom: number = 12, maxZoom: number = 15): Promise<boolean> {
  try {
    const fileManager = uni.getFileSystemManager();
    
    // 检查几个关键缩放级别的瓦片目录是否存在
    for (let z = minZoom; z <= maxZoom; z++) {
      const exists = await checkTileExist(`${SANDBOX_TILES_DIR}/${z}`);
      if (!exists) {
        console.warn(`缩放级别 ${z} 的瓦片目录不存在`);
        return false;
      }
      
      // 随机检查一个瓦片文件
      const tileExists = await checkTileExist(`${SANDBOX_TILES_DIR}/${z}/1000/1000.png`);
      if (!tileExists) {
        console.warn(`缩放级别 ${z} 的瓦片文件不完整`);
      }
    }
    
    return true;
  } catch (error) {
    console.error('验证离线瓦片失败:', error);
    return false;
  }
} 